home *** CD-ROM | disk | FTP | other *** search
- /*
- * Yamana's Otomeza Taiou Tool
- * ジグザグ
- *
- * 1995.08.06
- *
- */
- #include "otome_pi.h"
-
- const char longname[] = "DRAW : ジグザグ四角";
- int cnfg_max = 1;
- PI_CNFG cnfg[] =
- { /* 1234567890123456 ,min,max,def,set */
- { "ジグザグ大きさ" , 2, 16, 8, 8 },
- };
-
- #define USE_ENV PI_SET_ENV
- #define USE_TYPE PI_DRAW_BOXF
-
- #include "otome_pi.c"
-
-
- /********************************/
-
- int ZigZagBox( fr,wd )
- FRAME *fr;
- int wd;
- {
- int i;
- int lx,ly;
- char *mem,*h0,*h1,*v0,*v1;
- int ph,pv;
-
- lx = ( fr->rdwx - fr->lupx + 1 )/ (wd*2) ; /* 周期の数 */
- ly = ( fr->rdwy - fr->lupy + 1 )/ (wd*2) ;
-
- if( lx<2 || ly<2 ) return NOERR;
-
- ph = lx*2; /* 点の数 */
- pv = ly*2;
- if( (mem = PI_MALLOC( (ph+pv+1)*4*2 ))==NULL )
- return ERROR;
-
- h0 = mem ; /* ┌── ┐ */
- h1 = h0 + ph*4+2; /* │ */
- v0 = h1 + ph*4+2; /* │ */
- v1 = v0 + pv*4+2; /* └ ──┘ */
-
- WORD( h0 ) = WORD( h1 ) = ph;
- WORD( v0 ) = WORD( v1 ) = pv;
-
- for( i=0; i<ph ;i++ )
- {
- WORD( h0+2+i*4 ) = fr->lupx + wd*i ;
- WORD( h0+4+i*4 ) = fr->lupy + wd - (i & 1)*wd ;
-
- WORD( h1+2+i*4 ) = fr->lupx + wd*(i+1) ;
- WORD( h1+4+i*4 ) = fr->lupy + wd*ly*2 - (i & 1)*wd ;
- }
- for( i=0; i<pv ;i++ )
- {
- WORD( v0+2+i*4 ) = fr->lupx + (i & 1)*wd ;
- WORD( v0+4+i*4 ) = fr->lupy + wd*(i+1) ;
-
- WORD( v1+2+i*4 ) = fr->lupx + wd*lx*2 - wd + (i & 1)*wd ;
- WORD( v1+4+i*4 ) = fr->lupy + wd*i ;
- }
-
- EGB_connect( EgbPtr, h0 );
- EGB_connect( EgbPtr, h1 );
- EGB_connect( EgbPtr, v0 );
- EGB_connect( EgbPtr, v1 );
-
- PI_FREE( mem );
- return NOERR;
- }
-
- /********************************/
- #if 0
-
- int get_fr( fr, wd )
- FRAME *fr;
- int wd;
- {
- char *MosPtr;
- int ch,mx,my,ox,oy;
- int ex,ey;
- int cancel = 0;
-
- if( (MosPtr = PI_MALLOC( MosWorkSize ))==NULL )
- return PI_ERROR_NO_MEMORY;
-
- MOS_rdpos( &ch, &mx, &my );
- MOS_start( MosPtr, MosWorkSize );
- MOS_setpos( mx,my );
-
- EGB_writePage( EgbPtr, EGB_getWritePage(0,0) );
- EGB_writeMode( EgbPtr, EGB_XOR );
- EGB_paintMode( EgbPtr, 0x02 );
- EGB_color ( EgbPtr, EGB_FORECOL, -1 );
-
- fr->lupx = fr->rdwx = mx;
- fr->lupy = fr->rdwy = my;
- EGB_rectangle( EgbPtr, fr );
-
- do
- { MOS_rdpos( &ch, &mx, &my );
- }while( ch & MOS_LEFT );
-
- ex = fr->lupx;
- ey = fr->lupy;
- while( 1 )
- {
- do
- { ox=mx,oy=my;
- MOS_rdpos( &ch, &mx, &my );
-
- }while( ch==0 && ox==mx && oy==my );
-
- if( ch & 3 ) break;
- if( abs(mx - ex)<wd || abs(my - ey)<wd )
- continue;
-
- EGB_rectangle( EgbPtr, fr );
-
- ex = fr->lupx + (mx - fr->lupx)/wd*wd ;
- ey = fr->lupy + (my - fr->lupy)/wd*wd ;
-
- fr->rdwx = ex;
- fr->rdwy = ey;
- EGB_rectangle( EgbPtr, fr );
-
- }
- EGB_rectangle( EgbPtr, fr );
-
- if( ch & MOS_RIGHT ) cancel = 1;
- do
- { MOS_rdpos( &ch, &mx, &my );
- }while( ch & 3 );
-
- MOS_end();
- PI_FREE( MosPtr );
-
- return cancel;
- }
- #endif
-
-
- int APL_exec()
- {
- int width,tmp;
-
- width= cnfg[0].val; /* ジグザグの幅 */
-
- /*
- if( get_fr( &fr, width ) )
- return NOERR;
- if( fr.lupx > fr.rdwx ) tmp=fr.lupx, fr.lupx=fr.rdwx, fr.rdwx=tmp;
- if( fr.lupy > fr.rdwy ) tmp=fr.lupy, fr.lupy=fr.rdwy, fr.rdwy=tmp;
- */
- EGB_writePage( EgbPtr, pi_imge->page );
- EGB_writeMode( EgbPtr, EGB_PSET );
- EGB_paintMode( EgbPtr, 0x02 );
- EGB_color ( EgbPtr, EGB_FORECOL, pi_data->fore_color);
-
- if( ZigZagBox( (FRAME*)pi_para->gpara, width ) )
- return ERROR;
-
- memcpy( ret_fr, pi_para->gpara, sizeof(FRAME) );
-
- return NOERR;
- }
-